//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS MediaPackageVod service.
///
/// AWS Elemental MediaPackage VOD
public struct MediaPackageVod: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the MediaPackageVod client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            serviceName: "MediaPackageVod",
            serviceIdentifier: "mediapackage-vod",
            serviceProtocol: .restjson,
            apiVersion: "2018-11-07",
            endpoint: endpoint,
            errorType: MediaPackageVodErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Changes the packaging group's properities to configure log subscription
    @Sendable
    @inlinable
    public func configureLogs(_ input: ConfigureLogsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ConfigureLogsResponse {
        try await self.client.execute(
            operation: "ConfigureLogs", 
            path: "/packaging_groups/{Id}/configure_logs", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Changes the packaging group's properities to configure log subscription
    ///
    /// Parameters:
    ///   - egressAccessLogs: 
    ///   - id: The ID of a MediaPackage VOD PackagingGroup resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func configureLogs(
        egressAccessLogs: EgressAccessLogs? = nil,
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ConfigureLogsResponse {
        let input = ConfigureLogsRequest(
            egressAccessLogs: egressAccessLogs, 
            id: id
        )
        return try await self.configureLogs(input, logger: logger)
    }

    /// Creates a new MediaPackage VOD Asset resource.
    @Sendable
    @inlinable
    public func createAsset(_ input: CreateAssetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAssetResponse {
        try await self.client.execute(
            operation: "CreateAsset", 
            path: "/assets", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new MediaPackage VOD Asset resource.
    ///
    /// Parameters:
    ///   - id: The unique identifier for the Asset.
    ///   - packagingGroupId: The ID of the PackagingGroup for the Asset.
    ///   - resourceId: The resource ID to include in SPEKE key requests.
    ///   - sourceArn: ARN of the source object in S3.
    ///   - sourceRoleArn: The IAM role ARN used to access the source S3 bucket.
    ///   - tags: 
    ///   - logger: Logger use during operation
    @inlinable
    public func createAsset(
        id: String? = nil,
        packagingGroupId: String? = nil,
        resourceId: String? = nil,
        sourceArn: String? = nil,
        sourceRoleArn: String? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAssetResponse {
        let input = CreateAssetRequest(
            id: id, 
            packagingGroupId: packagingGroupId, 
            resourceId: resourceId, 
            sourceArn: sourceArn, 
            sourceRoleArn: sourceRoleArn, 
            tags: tags
        )
        return try await self.createAsset(input, logger: logger)
    }

    /// Creates a new MediaPackage VOD PackagingConfiguration resource.
    @Sendable
    @inlinable
    public func createPackagingConfiguration(_ input: CreatePackagingConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreatePackagingConfigurationResponse {
        try await self.client.execute(
            operation: "CreatePackagingConfiguration", 
            path: "/packaging_configurations", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new MediaPackage VOD PackagingConfiguration resource.
    ///
    /// Parameters:
    ///   - cmafPackage: 
    ///   - dashPackage: 
    ///   - hlsPackage: 
    ///   - id: The ID of the PackagingConfiguration.
    ///   - mssPackage: 
    ///   - packagingGroupId: The ID of a PackagingGroup.
    ///   - tags: 
    ///   - logger: Logger use during operation
    @inlinable
    public func createPackagingConfiguration(
        cmafPackage: CmafPackage? = nil,
        dashPackage: DashPackage? = nil,
        hlsPackage: HlsPackage? = nil,
        id: String? = nil,
        mssPackage: MssPackage? = nil,
        packagingGroupId: String? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreatePackagingConfigurationResponse {
        let input = CreatePackagingConfigurationRequest(
            cmafPackage: cmafPackage, 
            dashPackage: dashPackage, 
            hlsPackage: hlsPackage, 
            id: id, 
            mssPackage: mssPackage, 
            packagingGroupId: packagingGroupId, 
            tags: tags
        )
        return try await self.createPackagingConfiguration(input, logger: logger)
    }

    /// Creates a new MediaPackage VOD PackagingGroup resource.
    @Sendable
    @inlinable
    public func createPackagingGroup(_ input: CreatePackagingGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreatePackagingGroupResponse {
        try await self.client.execute(
            operation: "CreatePackagingGroup", 
            path: "/packaging_groups", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new MediaPackage VOD PackagingGroup resource.
    ///
    /// Parameters:
    ///   - authorization: 
    ///   - egressAccessLogs: 
    ///   - id: The ID of the PackagingGroup.
    ///   - tags: 
    ///   - logger: Logger use during operation
    @inlinable
    public func createPackagingGroup(
        authorization: Authorization? = nil,
        egressAccessLogs: EgressAccessLogs? = nil,
        id: String? = nil,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreatePackagingGroupResponse {
        let input = CreatePackagingGroupRequest(
            authorization: authorization, 
            egressAccessLogs: egressAccessLogs, 
            id: id, 
            tags: tags
        )
        return try await self.createPackagingGroup(input, logger: logger)
    }

    /// Deletes an existing MediaPackage VOD Asset resource.
    @Sendable
    @inlinable
    public func deleteAsset(_ input: DeleteAssetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAssetResponse {
        try await self.client.execute(
            operation: "DeleteAsset", 
            path: "/assets/{Id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing MediaPackage VOD Asset resource.
    ///
    /// Parameters:
    ///   - id: The ID of the MediaPackage VOD Asset resource to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAsset(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAssetResponse {
        let input = DeleteAssetRequest(
            id: id
        )
        return try await self.deleteAsset(input, logger: logger)
    }

    /// Deletes a MediaPackage VOD PackagingConfiguration resource.
    @Sendable
    @inlinable
    public func deletePackagingConfiguration(_ input: DeletePackagingConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeletePackagingConfigurationResponse {
        try await self.client.execute(
            operation: "DeletePackagingConfiguration", 
            path: "/packaging_configurations/{Id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a MediaPackage VOD PackagingConfiguration resource.
    ///
    /// Parameters:
    ///   - id: The ID of the MediaPackage VOD PackagingConfiguration resource to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePackagingConfiguration(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeletePackagingConfigurationResponse {
        let input = DeletePackagingConfigurationRequest(
            id: id
        )
        return try await self.deletePackagingConfiguration(input, logger: logger)
    }

    /// Deletes a MediaPackage VOD PackagingGroup resource.
    @Sendable
    @inlinable
    public func deletePackagingGroup(_ input: DeletePackagingGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeletePackagingGroupResponse {
        try await self.client.execute(
            operation: "DeletePackagingGroup", 
            path: "/packaging_groups/{Id}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a MediaPackage VOD PackagingGroup resource.
    ///
    /// Parameters:
    ///   - id: The ID of the MediaPackage VOD PackagingGroup resource to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePackagingGroup(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeletePackagingGroupResponse {
        let input = DeletePackagingGroupRequest(
            id: id
        )
        return try await self.deletePackagingGroup(input, logger: logger)
    }

    /// Returns a description of a MediaPackage VOD Asset resource.
    @Sendable
    @inlinable
    public func describeAsset(_ input: DescribeAssetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAssetResponse {
        try await self.client.execute(
            operation: "DescribeAsset", 
            path: "/assets/{Id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a description of a MediaPackage VOD Asset resource.
    ///
    /// Parameters:
    ///   - id: The ID of an MediaPackage VOD Asset resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeAsset(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAssetResponse {
        let input = DescribeAssetRequest(
            id: id
        )
        return try await self.describeAsset(input, logger: logger)
    }

    /// Returns a description of a MediaPackage VOD PackagingConfiguration resource.
    @Sendable
    @inlinable
    public func describePackagingConfiguration(_ input: DescribePackagingConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePackagingConfigurationResponse {
        try await self.client.execute(
            operation: "DescribePackagingConfiguration", 
            path: "/packaging_configurations/{Id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a description of a MediaPackage VOD PackagingConfiguration resource.
    ///
    /// Parameters:
    ///   - id: The ID of a MediaPackage VOD PackagingConfiguration resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func describePackagingConfiguration(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePackagingConfigurationResponse {
        let input = DescribePackagingConfigurationRequest(
            id: id
        )
        return try await self.describePackagingConfiguration(input, logger: logger)
    }

    /// Returns a description of a MediaPackage VOD PackagingGroup resource.
    @Sendable
    @inlinable
    public func describePackagingGroup(_ input: DescribePackagingGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePackagingGroupResponse {
        try await self.client.execute(
            operation: "DescribePackagingGroup", 
            path: "/packaging_groups/{Id}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a description of a MediaPackage VOD PackagingGroup resource.
    ///
    /// Parameters:
    ///   - id: The ID of a MediaPackage VOD PackagingGroup resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func describePackagingGroup(
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePackagingGroupResponse {
        let input = DescribePackagingGroupRequest(
            id: id
        )
        return try await self.describePackagingGroup(input, logger: logger)
    }

    /// Returns a collection of MediaPackage VOD Asset resources.
    @Sendable
    @inlinable
    public func listAssets(_ input: ListAssetsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAssetsResponse {
        try await self.client.execute(
            operation: "ListAssets", 
            path: "/assets", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a collection of MediaPackage VOD Asset resources.
    ///
    /// Parameters:
    ///   - maxResults: Upper bound on number of records to return.
    ///   - nextToken: A token used to resume pagination from the end of a previous request.
    ///   - packagingGroupId: Returns Assets associated with the specified PackagingGroup.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAssets(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        packagingGroupId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAssetsResponse {
        let input = ListAssetsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            packagingGroupId: packagingGroupId
        )
        return try await self.listAssets(input, logger: logger)
    }

    /// Returns a collection of MediaPackage VOD PackagingConfiguration resources.
    @Sendable
    @inlinable
    public func listPackagingConfigurations(_ input: ListPackagingConfigurationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPackagingConfigurationsResponse {
        try await self.client.execute(
            operation: "ListPackagingConfigurations", 
            path: "/packaging_configurations", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a collection of MediaPackage VOD PackagingConfiguration resources.
    ///
    /// Parameters:
    ///   - maxResults: Upper bound on number of records to return.
    ///   - nextToken: A token used to resume pagination from the end of a previous request.
    ///   - packagingGroupId: Returns MediaPackage VOD PackagingConfigurations associated with the specified PackagingGroup.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPackagingConfigurations(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        packagingGroupId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPackagingConfigurationsResponse {
        let input = ListPackagingConfigurationsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            packagingGroupId: packagingGroupId
        )
        return try await self.listPackagingConfigurations(input, logger: logger)
    }

    /// Returns a collection of MediaPackage VOD PackagingGroup resources.
    @Sendable
    @inlinable
    public func listPackagingGroups(_ input: ListPackagingGroupsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPackagingGroupsResponse {
        try await self.client.execute(
            operation: "ListPackagingGroups", 
            path: "/packaging_groups", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a collection of MediaPackage VOD PackagingGroup resources.
    ///
    /// Parameters:
    ///   - maxResults: Upper bound on number of records to return.
    ///   - nextToken: A token used to resume pagination from the end of a previous request.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPackagingGroups(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPackagingGroupsResponse {
        let input = ListPackagingGroupsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listPackagingGroups(input, logger: logger)
    }

    /// Returns a list of the tags assigned to the specified resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .GET, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns a list of the tags assigned to the specified resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) for the resource. You can get this from the response to any request to the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Adds tags to the specified resource. You can specify one or more tags to add.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds tags to the specified resource. You can specify one or more tags to add.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) for the resource. You can get this from the response to any request to the resource.
    ///   - tags: A collection of tags associated with a resource
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [String: String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes tags from the specified resource. You can specify one or more tags to remove.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/tags/{ResourceArn}", 
            httpMethod: .DELETE, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes tags from the specified resource. You can specify one or more tags to remove.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) for the resource. You can get this from the response to any request to the resource.
    ///   - tagKeys: A comma-separated list of the tag keys to remove from the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates a specific packaging group. You can't change the id attribute or any other system-generated attributes.
    @Sendable
    @inlinable
    public func updatePackagingGroup(_ input: UpdatePackagingGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdatePackagingGroupResponse {
        try await self.client.execute(
            operation: "UpdatePackagingGroup", 
            path: "/packaging_groups/{Id}", 
            httpMethod: .PUT, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a specific packaging group. You can't change the id attribute or any other system-generated attributes.
    ///
    /// Parameters:
    ///   - authorization: 
    ///   - id: The ID of a MediaPackage VOD PackagingGroup resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func updatePackagingGroup(
        authorization: Authorization? = nil,
        id: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdatePackagingGroupResponse {
        let input = UpdatePackagingGroupRequest(
            authorization: authorization, 
            id: id
        )
        return try await self.updatePackagingGroup(input, logger: logger)
    }
}

extension MediaPackageVod {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: MediaPackageVod, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension MediaPackageVod {
    /// Return PaginatorSequence for operation ``listAssets(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAssetsPaginator(
        _ input: ListAssetsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAssetsRequest, ListAssetsResponse> {
        return .init(
            input: input,
            command: self.listAssets,
            inputKey: \ListAssetsRequest.nextToken,
            outputKey: \ListAssetsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAssets(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Upper bound on number of records to return.
    ///   - packagingGroupId: Returns Assets associated with the specified PackagingGroup.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAssetsPaginator(
        maxResults: Int? = nil,
        packagingGroupId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAssetsRequest, ListAssetsResponse> {
        let input = ListAssetsRequest(
            maxResults: maxResults, 
            packagingGroupId: packagingGroupId
        )
        return self.listAssetsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPackagingConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackagingConfigurationsPaginator(
        _ input: ListPackagingConfigurationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPackagingConfigurationsRequest, ListPackagingConfigurationsResponse> {
        return .init(
            input: input,
            command: self.listPackagingConfigurations,
            inputKey: \ListPackagingConfigurationsRequest.nextToken,
            outputKey: \ListPackagingConfigurationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPackagingConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Upper bound on number of records to return.
    ///   - packagingGroupId: Returns MediaPackage VOD PackagingConfigurations associated with the specified PackagingGroup.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackagingConfigurationsPaginator(
        maxResults: Int? = nil,
        packagingGroupId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPackagingConfigurationsRequest, ListPackagingConfigurationsResponse> {
        let input = ListPackagingConfigurationsRequest(
            maxResults: maxResults, 
            packagingGroupId: packagingGroupId
        )
        return self.listPackagingConfigurationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPackagingGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackagingGroupsPaginator(
        _ input: ListPackagingGroupsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPackagingGroupsRequest, ListPackagingGroupsResponse> {
        return .init(
            input: input,
            command: self.listPackagingGroups,
            inputKey: \ListPackagingGroupsRequest.nextToken,
            outputKey: \ListPackagingGroupsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPackagingGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: Upper bound on number of records to return.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPackagingGroupsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPackagingGroupsRequest, ListPackagingGroupsResponse> {
        let input = ListPackagingGroupsRequest(
            maxResults: maxResults
        )
        return self.listPackagingGroupsPaginator(input, logger: logger)
    }
}

extension MediaPackageVod.ListAssetsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MediaPackageVod.ListAssetsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            packagingGroupId: self.packagingGroupId
        )
    }
}

extension MediaPackageVod.ListPackagingConfigurationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MediaPackageVod.ListPackagingConfigurationsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            packagingGroupId: self.packagingGroupId
        )
    }
}

extension MediaPackageVod.ListPackagingGroupsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> MediaPackageVod.ListPackagingGroupsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}
